Перейти к основному содержимому

5.03. Структуры проекта

Разработчику Архитектору

Структуры проекта

Что такое пакет?

Пакетом (пространством имен) в Java называется структура вложенных по какому-то признаку папок с размещенными в них классами (интерфейсами, перечислениями, аннотациями), необходимыми проекту.

В Java используется пакетная структура – способ организации классов в папках, который помогает избежать конфликтов имён и группировать код логически. Это обязательная структура. Чтобы система понимала, что означает команда, указанная программистом в исходном коде в виде слова, нужно сообщить системе об использовании пакета, который содержит код-содержание этого слова:

«Дружище, налей мне молока!»
«А где мне взять молоко?».

Мы, люди, многие элементарные вещи уже изначально автоматизировали в себе и понимаем подсознательно. Мы прекрасно знаем, что молоко в холодильнике. Но программе нужно показать, что нам понадобится холодильник. Поэтому общение с программой будет как-то так:

«Дружище, запомни – вот холодильник. Там есть молоко».
«Дружище, налей мне молока!»
«Ок, вижу, молоко в холодильнике. Сейчас сделаю».

Вот поэтому код библиотеки или проекта формируется в составе пакета (package).

Пакеты в проекте хранятся в строгой структуре:

  • com/mycompany/project/Main.java – физический путь;
  • com.mycompany.project – путь в коде.

com – корень пакета. Только строчные буквы. Это префикс домена, обычно обратный интернет-домен компании или проекта. Нужен для уникальности пакетов в мире. Можно указывать своё, но рекомендуется использовать стандарт:

  • com – для коммерческих проектов;
  • org – для открытых проектов;
  • net, io, ru – тоже допустимы.

mycompany – название компании или автора, допустим, имя (если проект личный). Желательно делать уникальным. Только строчные буквы, несмотря на то что это будет имя или название – допустим, не Timur, а timur.

project – название проекта или модуля, библиотеки, подсистемы. Допустим, calculator, utils или как-то так. Только строчные буквы, название может быть любым.

Современные Java-проекты используют системы сборки Maven и Gradle. Это инструменты, которые автоматизируют компиляцию кода, управление зависимостями (библиотеками), запуск тестов, создание готовых приложений и развёртывание (деплой).

Как работает Maven?

Конфигурация проекта хранится в файле pom.xml (Project Object Model), это «сердце» проекта.

pom.xml содержит:

  • метаданные (название, версия, автор);
  • зависимости (библиотеки);
  • плагины (для сборки, тестирования);
  • настройки профилей (dev, prod).

POM является базовым модулем Maven. Это специальный XML-файл, который всегда хранится в базовой директории проекта и называется pom.xml. Файл POM содержит информацию о проекте и различных деталях конфигурации, которые используются Maven для создания проекта.

Maven работает по жизненному циклу сборки проекта, который состоит из фаз. Каждая фаза представляет собой этап в процессе создания артефакта:

  • validate - проверяет корректность проекта и наличия необходимых данных;
  • compile - компилирует исходный код проекта;
  • test – запускает юнит-тесты;
  • package - упаковывает скомпилированный код в JAR/WAR/SO и т.д.;
  • verify - выполняет проверки после упаковки перед установкой;
  • install - устанавливает артефакт в локальное хранилище Maven;
  • deploy - передаёт артефакт в удалённый репозиторий (например, Nexus, Artifactory).

Можно вызвать одну из этих фаз через команды, к примеру:

mvn compile        # компиляция
mvn package # сборка артефакта
mvn install # установка в локальный репозиторий

Файлы проекта распределены по строгой стандартной структуре:

ПутьНазначение
/ПроектОбщая папка проекта
/Проект/pom.xmlГлавный конфигурационный файл (Maven)
/Проект/srcДиректория, где хранится весь исходный код Java-проекта
/Проект/src/mainОсновной код проекта
/Проект/src/main/javaИсходные файлы Java, организованные в пакетной структуре
/Проект/src/main/java/com/mycompany/projectПример пакета в проекте
/Проект/src/main/resourcesРесурсы: конфигурационные файлы, локализация, изображения, CSS, JS и другие не-кодовые файлы
/Проект/src/testТестовый код, не включаемый в финальную сборку
/Проект/src/test/javaТестовые классы (например, с использованием JUnit, TestNG)
/Проект/src/test/resourcesКонфигурация и ресурсы, используемые при тестировании
/Проект/targetКаталог для автоматически генерируемых файлов (сборка, артефакты, временные файлы)

Артефакт в Maven – это результат сборки проекта, например, JAR-файл, который содержит код, библиотеки, ресурсы и метаданные.

Каждый артефакт имеет уникальный идентификатор, состоящий из элементов:

  • groupId – com.example – организация или домен;
  • artifactId – my-app – имя проекта или библиотеки;
  • version – 1.0.0., 2.1.3-SNAPSHOT – версия.

Пример:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.0</version>
</dependency>

Это будет ссылка на артефакт:

org.springframework.boot:spring-boot-starter-web:2.7.0

Артефакты бывают следующих видов:

  • .jar – обычные Java-библиотеки;
  • .war – веб-приложения;
  • .pom – описание проекта;
  • .aar – Android-библиотеки..

Репозиторий – это место, где хранятся артефакты. Они могут храниться локально (локальный репозиторий), в общедоступном репозитории Maven (центральный), и в удалённом (частном), для приватных артефактов.

При первом использовании зависимости Maven скачивает её из центрального репозитория, и сохраняет в локальный. При повторном использовании уже берёт из локального. То есть, добавляя зависимость в pom.xml, мы скачиваем и сохраняем локально в папку ~/.m2/repository.

Как работает Gradle?

Gradle – система автоматической сборки, построенная с учетом принципов Maven, но предоставляющая дополнительные возможности на языках Groovy и Kotlin вместо традиционной XML-образной формы представления конфигурации проекта.

Принцип разделения на src/main и src/test аналогичен Maven, но конфигурация хранится в build.gradle, а не в pom.xml. Отличие есть в папке для автоматически сгенерированных файлов – в Maven они хранятся по пути /target, а в Gradle - /build.

Краткое сравнение Maven и Gradle

КритерийMavenGradle
Тип конфигурацииXMLGroovy/Kotlin DSL
Файл конфигурацииpom.xmlbuild.gradle

Команды в Maven и Gradle

КритерийMavenGradle
Компиляцияmvn compilegradle compileJava
Запуск тестовmvn testgradle test
Сборка JAR/WARmvn packagegradle build
Установка в локальный кэшmvn installgradle publishToMavenLocal
Очистка кэшаmvn cleangradle clean
Запуск приложенияmvn exec:javagradle run
Пропустить тестыmvn install -DskipTestsgradle build -x test
Обновить зависимостиmvn dependency:resolvegradle dependencies
Создать проектmvn archetype:generategradle init
Показать список задачmvn help:describegradle tasks

Аналогичные секции в pom.xml и build.gradle

MavenGradle
<groupId>group
<artifactId>Имя проекта (из settings.gradle)
<version>version
<properties>Переменные в ext {}
<dependencies>dependencies {}
maven-compiler-pluginjava.toolchain